package com.bryantkobe.sort;

import java.util.Arrays;

/**
 * @ClassName QuickSort
 * @Description 快速排序
 * @Author kobe
 * @Date 2021/4/28 17:38
 */
public class QuickSort {
    public static void main(String[] args) {
        //定义一个数组
        //int[] arr = {1,8,5,9,6,3,5,7,6,44};
        int[] arr = new int[100000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random()*100000);
        }

        long startTime = System.currentTimeMillis();
        quickSort(arr,0, arr.length-1);
        long endTime = System.currentTimeMillis();

        //快速排序执行时间:60--100
        System.out.println("快速排序执行时间："+(endTime - startTime));
        //System.out.println("arr = "+ Arrays.toString(arr));
    }

    /**
     * 快速排序
     * @param arr
     * @param left
     * @param right
     */
    private static void quickSort(int[] arr,int left,int right) {
        //左下标
        int l = left;
        //右下标
        int r = right;
        //pivot 中轴值
        int pivot =arr[(left + right) / 2];
        //临时变量，作为交换时使用
        int temp = 0;

        /*
        *while循环的目的是让比pivot值小的放左边
        * 比pivot值大放右边
        * */
        while (l < r){
            //在pivot的左边一直找，找到大于等于pivot值，才退出
            while (arr[l] < pivot){
                l += 1;
            }
            //在pivot右边一直找，找到小于等于pivot值，才退出
            while (arr[r] > pivot){
                r -= 1;
            }

            /*
            * 如果l >= r说明pivot的左右两边的值，已经按照左边全部是小于等于pivot的值
            * 右边全部是大于等于pivot值
            * */
            if (l >= r){
                break;
            }

            //交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;

            //如果交换后，发现这个arr[l] == pivot值 相等 r--,前移
            if (arr[l] == pivot){
                r -= 1;
            }
            //如果交换后，发现这个arr[r] == pivot值 相等 l++,后移
            if (arr[r] == pivot){
                l += 1;
            }
        }

        //如果l == r，必须l++,r--，否则会出现栈溢出
        if (l == r){
            l += 1;
            r -= 1;
        }

        //向左递归
        if (left < r){
            quickSort(arr,left,r);
        }

        //向右递归
        if (right > l){
            quickSort(arr,l,right);
        }
    }
}
